iT邦幫忙

2023 iThome 鐵人賽

DAY 7
3
Modern Web

GPT 救救我!菜雞小海獺的前端成長之旅系列 第 7

D7 - CSS - 選擇器們 - 基本、分組與組合

  • 分享至 

  • xImage
  •  

選擇器(selector)

選擇器顧名思義,選取要套用 CSS 的對象。在 CSS 的世界中有著許多選擇器,用得好的話,可以大幅增加工作效率!

類型(type)選擇器

可以指定 HTML 中的任何 tag name、class、id、屬性,或者是全選(*,universal selector)。

注意:只要(一或多個的)選擇器語法錯誤,整組宣告會被無視。

  • type selector,元素選取器:選取 HTML 中的指定 tag tag

  • universal selector,全局選取器:選取 HTML 中的全部 tag

    • 也可置於選取器中的子元素之前,表示指定範圍是他爸(父元素)。
    • 例:article *:first-child,它爸是 article,選取的範圍限制是 article 的第一個子元素。
  • Class selectors,class 選取器:以 . 選取指定 class。.class

  • ID selectors,id 選取器:以 # 選取指定 id。#id

    • 註:id 不可重複,同頁面中,每個 id 都只能是唯一的。
/* 範例 */
/* 選取指定 tag */
button{
	color: #FFBFBF;
}

/* 選取指定 class */
.students{
	color: #FFBFBF;
}

/* 選取指定 id */
#catboxy{
	color: #FFBFBF;
}

/* 用逗號連接,一次選取多個選擇器以同時套用樣式 */
button,.students,#catboxy{
	color: #FFBFBF;
}

/* 選取全部 tag */
*{
	background-color: #FFBFBF;
}

/* ============================================================ */
/* 選取某元素的指定屬性 */
button[type]{
	border-radius: 10px;
}

/* 選取某元素的指定屬性與值 */
button[type="button"]{
	border-radius: 10px;
}

https://ithelp.ithome.com.tw/upload/images/20230908/20161801djbMmcZ8xP.png
Fig. 1-1. 同時符合多個 class 的元素們 - code 圖

https://ithelp.ithome.com.tw/upload/images/20230908/20161801dJNAIkgnJE.png
Fig. 1-2. 同時符合多個 class 的元素們 - 結果

  • 屬性選取器們
    • tag[attribute]:選取指定屬性

    • tag[attribute="value"]:選取特定屬性值

    • tag[attribute*="value"]:選取包含特定字串的屬性值

    • tag[attribute~="value"]:在以空格分隔的屬性值中,選取特定屬性值 value

    • tag[attribute^="value"]:在屬性值中找起始屬性值 value

    • tag[attribute|="value"]:找開頭為 vlaue- 的屬性值

    • tag[attribute$="value"]:找屬性值結尾為 value

    • 備註

      • 除了使用 tag 外,也可以結合之前提到的各種選擇器來花式組合使用,例如 img[alt~="person"][src*="lorem"]

      • 屬性選取器們對大小寫敏感,也就是說 class="info" 跟 class="inFo" 在它眼中是不同的。可以加上 i 使搜尋結果包含大小寫,如 tag[attribute="value" i],這樣不管是 value、valuE 還是 Value,都可套用樣式

	<ul>
	  <li>Item 1</li>
	  <li class="a first-li">Item 2</li>
	  <li class="a b">Item 3</li>
	  <li class="ab first-box">Item 4</li>
	  <li class="front-end ab">Item 5</li>
	  <li class="front-end foo">Item 6</li>
	  <li class="cd foo front-end">Item 7</li>
	  <li class="front cd foo">Item 8</li>
	</ul>
	/* 有 class 屬性的所有 li 都吃樣式*/
	li[class] {
	  font-size: 200%;
	}
	
	/* 指定 li 屬性值為 a 吃樣式 */
	li[class="a"] {
	  background-color: yellow;
	}
	
	/* 以空格分隔的屬性值們,若有 a 就會吃樣式 */
	li[class~="a"] {
	  color: red;
	}
	
	/* 屬性值內含有 a 的(a, ab, a b)都會吃到樣式 */
	li[class*="a"] {
	  font-size: 28px;
	}
	
	/* 屬性值"起始"為 */
	li[class^="ab"] {
	  border: 2px solid #005757;
	}
	
	/* 和上一個有點像,但是是找屬性值"開頭"為 front- 的元素*/
	li[class|="front"] {
	  box-shadow: 3px 3px 5px 3px #6c3365;
	}
	
	/* 找屬性值的"結尾" */
	li[class$="foo"] {
	  padding: 20px;
	}

Fig. 2-1. 選取指定屬性與屬性值 - code

https://ithelp.ithome.com.tw/upload/images/20230908/20161801mqtS7HvLId.png
Fig. 2-2. 選取指定屬性與屬性值 - 結果

選擇器的分組(Grouping selector)

Selector list

以逗號跟空格組合不同選擇器的一種方法。例:selector1, selector2, selector3,結果會是 selector1, selector2, selector3 套用同一種樣式。

但連接的 selector 們,只要其中一個語法錯誤,整組就失效了XD

/* 以下這兩種用法結果一樣 */
/* 直接選取 tag name */
h1 {
	color: red;
}

div {
	color: red;
}

/* 使用 , */
h1, div {
	color: red;
}

/* 錯誤舉例 */
h1,
h2:hover,
div {
	color: red;
}

Forgiving selector list

可以用 is() 或 :where 來解決。這類語法可單獨解析個別的 selector,所以一個錯了也不會影響到其他組。

後續提到偽類時會再說明。

:is(h1, h2, div) {
	color: red;
}

選擇器的各種組合方式(combinator)們

  • descendant selector,後代選擇器(space,空格)

    • 例:selector1 selector2,兩個 selector 中間以空格分開。
    • 所有 selector1 內的 selector2 的元素都會被選擇,不管 selector2 在多深的子層中,都可以吃到樣式。
  • child selector,子層選擇器(>)

    • 例:selector1>selector2,兩個 selector 中間以 > 連接。
    • 所有 selector1 的子層 selector2 皆套用樣式。
    • 與後代選擇器相比,子層選擇器更嚴謹,一定要是父子關係才能吃到樣式。
  • general sibling selector,通用兄弟選擇器(~)

    • 例:selector1~selector2,兩個 selector 中間以 ~ 連接。
    • 具有相同父層/節點, selector1 後的所有 selector2 都會吃到樣式。
    • 兩個 selector 不一定是相鄰的,中間可能有別人。
  • adjacent sibling selector,相鄰兄弟選擇器(+)

    • 例:selector1+selector2,兩個 selector 中間以 + 連接。
    • 有同樣的父層/父節點,緊跟在 selector1 後的同層 selector2 會被選取。

例 code

<h1>選擇器的各種組合方式</h1>
<div class="box test-1">
  <span>後代選擇器(空格):所有 .test1 後的 span 會變綠色背景</span>
  <code>
    .test-1 span {
    background-color: #00575750;
    }
  </code>
  <ul>
    <li>子層選擇器(>):有父子關係的ul(父)與li(子)會變紅色文字</li>
    <li><span>第三</span></li>
  </ul>
  <span>我也是綠底的</span>
</div>
<div class="box test-2">
  <span>通用兄弟選擇器(~):同個父層的 p 後的 span 會變紫粉紅色背景</span>
  <p>第一區</p>
  <code>
    .test-2 p~span {
    background-color: #FF44FF;
    }
  </code>
  <span>是我</span>
  <p>
    <span>第四區</span>
  </p>
  <span>是我</span>
</div>

<div class="box test-3">
  <p>相鄰兄弟選擇器(+):同個父節點 .box 中,緊跟在 p 後的 div 會變黃底。</p>
  <span>第一區</span>
  <code>
    .box p+div {
    background-color: #eccc88;
    }
  </code>
  <p>第一區</p>
  <div>是我</div>
  <div>第三區</div>
  <p>第四區</p>
  <div>是我</div>

</div>
h1 {
  margin-bottom: 20px;
}

.box {
  border: 1px solid black;
  margin-bottom: 20px;
  padding: 20px;
}

/* 後代選擇器(空格) */
.test-1 span {
  background-color: #00575750;
}

/* 子層選擇器(>)*/
ul > li {
  color: #ff0000;
}

/* 通用兄弟選擇器(~) */
.test-2 p ~ span {
  background-color: #ff44ff;
}

/* 相鄰兄弟選擇器(+) */
.box p + div {
  background-color: #eccc88;
}

https://ithelp.ithome.com.tw/upload/images/20230908/201618011cFzgCSPFA.png
Fig. 3. 結果


參考資料

  • CSS 选择器 - CSS:层叠样式表 | MDN,https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_selectors#%E7%9B%B8%E5%AF%B9%E9%80%89%E6%8B%A9%E5%99%A8
  • 类型、类和 ID 选择器 - 学习 Web 开发 | MDN,https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Building_blocks/Selectors/Type_Class_and_ID_Selectors
  • attribute | CSS-Tricks - CSS-Tricks,https://css-tricks.com/almanac/selectors/a/attribute/
  • CSS Combinators,https://www.w3schools.com/css/css_combinators.asp
  • 后代选择器 - CSS:层叠样式表 | MDN,https://developer.mozilla.org/zh-CN/docs/Web/CSS/Descendant_combinator

上一篇
D6 - CSS - 簡介
下一篇
D8 - CSS - 選擇器們 - 偽類(pseudo-class)
系列文
GPT 救救我!菜雞小海獺的前端成長之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言